#include <stdio.h>

int main(){
	/* 
	int a[5]  = {1,2,3,4,5};
	int *p = a;
	int i;
	for(i = 0; i < 5; i++){
		printf("%d\n", *(p + i)); 
	}
	int b[2][3]  = {11,22,33,44,55,66};
	int *q = b;
	int j;
	for(j = 0; j < 6; j++){
		printf("%d\n", *(q + j)); 
	}
	*/ 
	int c[2][3]  = {111,222,333,444,555,666};
	int (*w)[3] = c;
	int i,j;
	for(i = 0; i < 2; i++){
		for(j = 0; j < 3; j++){
			printf("%d\t", w[i][j]);
		}
	}
	printf("\n");
	/* 
	int (*p)[5] = a;
	printf("%p\n", p);
	printf("%p\n", a);
	printf("%p\n", &(a[0]));
	*/ 
	/* 
	分析
	在 int *p = a; 的情况下，p 指向 数组 a 的第一个元素的地址。
	那么，在 int (*p)[5] = a; 的情况下， p 显然不是指向 a 的第一个元素的地址了。
	对照来讲， int 对 int， [5]  对 [5] ,那么 *p 就对上了 a;
	那么 p 就是 &a ； 这样看，二者类型才能保持一致。
	因此 
	*/   
	/* 
	int (*p)[5] = &a;
	printf("%p\n", p);
	printf("%p\n", a);
	printf("%p\n", &(a[0]));
	*/ 
	/* 
	也就是
	int a = 132;  ==> int *p = &a;
	int a[] = 132; => int (*p)[] = &a;
	*/ 
	//int ax[4] = 123;
	 
}
